package Principal;


import java.io.IOException;
import javax.microedition.rms.*;

/**
 * @author Noelia Alonso Garrido
 * @author Abel Torres Alonso
 * @author Diego Vallejo Alonso
 */
public class RegistroGastos {
    private static RecordStore rs;

    public RegistroGastos() {
        rs = null;
    }

    public void abrirRegistroGastos() {
        try {
            rs = RecordStore.openRecordStore("Gastos", true);
        } catch (RecordStoreException e) {
            System.out.println("Error al abrir el registro de gastos");
        }
    }

    /**
     * Inserta una moneda en el registro
     * @param mon La moneda a insertar en el registro.
     */
    public void insertarGasto(Gasto g) {
        byte[] registro;
        try {
            registro = g.aByteArray();
            rs.addRecord(registro, 0, registro.length);
            System.out.println("Se insertó un gasto en el registro de gastos");

        } catch (IOException ex) {
            System.out.println("Fallo al serializar un objeto gasto");
        } catch (RecordStoreNotOpenException er) {
            System.out.println("Fallo porque el registro no está abierto");
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Cierra el registro de manera segura.
     */
    public void cierraRegistroGastos() {
        try {
            rs.closeRecordStore();
        } catch (RecordStoreNotOpenException ex) {
            ex.printStackTrace();
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Devuelve una enumeración para navegar por el registro de gastos, ordenados por fecha
     * @return enumeración para navegar por el registro
     */
    
    public RecordEnumeration getEnumeracion() {
        try {
            RecordComparator c = new ComparadorGastos();    //Comparador para ordenar los registros por fecha
            RecordEnumeration re = rs.enumerateRecords(null, c, false);
            return re;
        } catch (RecordStoreNotOpenException ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * Devuelve una enumeración para navegar por el registro de gastos, ordenados por cantidad
     * @return enumeración para navegar por el registro
     */

    public RecordEnumeration getEnumeracionC() {
        try {
            RecordComparator c = new ComparadorGastosCantidad();    //Comparador para ordenar los registros por fecha
            RecordEnumeration re = rs.enumerateRecords(null, c, false);
            return re;
        } catch (RecordStoreNotOpenException ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * Informa del número de gastos que hay en el registro.
     * @return el número de monedas diferentes almacendas en el registro.
     * @throws RecordStoreNotOpenException
     */
    public int contarGastos() throws RecordStoreNotOpenException {
        return rs.getNumRecords();
    }

    /**
     * Extrae del registro la moneda que ocupa la posición indicada.
     * @param posicion del registro que queremos obtener. Debe estar validada (obtenida de una enumeración)
     * @return La moneda que está en esa posición.
     * @throws RecordStoreNotOpenException
     * @throws InvalidRecordIDException
     * @throws RecordStoreException
     */
    public Gasto extraeGasto(int posicion) throws RecordStoreNotOpenException, InvalidRecordIDException, RecordStoreException {
            Gasto g = new Gasto();
            int tamano = rs.getRecordSize(posicion);
            byte[] registro = new byte[tamano];
            rs.getRecord(posicion, registro, 0);
            try {
                g.desdeByteArray(registro);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            return g;
    }

    /**
     * Borra la moneda que está en una posición determinada del registro
     * @param posicion  La posición del registro que se quiere borrar.
     * @return
     */

    public void borrarGasto(int posicion) {
        RecordEnumeration r;

        try {
            rs.deleteRecord(posicion);
            System.out.println("Registros guardadas:" + rs.getNumRecords());
        } catch (RecordStoreNotOpenException ex) {
            ex.printStackTrace();
        } catch (InvalidRecordIDException ex) {
            ex.printStackTrace();
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Reemplaza el gasto en que haya en la posición indicada por una nueva
     * @param g   El nuevo gasto
     * @param posicion  La posición en la que está la moneda a reemplazar
     */

     public void reemplazaGasto(Gasto g, int posicion) {
        byte[] registro;

        try {
            registro = g.aByteArray();
            rs.setRecord(posicion, registro, 0, registro.length);

        } catch (IOException ex) {
            System.out.println("Fallo al serializar un objeto gasto");
        } catch (RecordStoreNotOpenException er) {
            System.out.println("Fallo porque el registro no está abierto");
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        }
    }
}
